import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
// 导入Element Plus图标
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
import router from './router'
import pinia from './stores'
import App from './App.vue'
import './style.css'

// 预加载重要路由组件
const preloadComponents = () => {
  // 使用 requestIdleCallback 在浏览器空闲时预加载组件
  const idleCallback = window.requestIdleCallback || ((cb) => setTimeout(cb, 1));
  idleCallback(() => {
    // 只预加载核心组件
    import('./views/Chat.vue').then(() => {
      console.debug('Chat组件预加载完成')
      
      // 使用延迟加载预加载次要组件
      setTimeout(() => {
        import('./components/ChatMessage.vue')
      }, 2000)
    })
  })
}

// 创建应用实例
const app = createApp(App)

// 注册所有图标
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
  app.component(key, component)
}

// 全局错误处理
app.config.errorHandler = (err, instance, info) => {
  console.error('应用错误:', err)
  // 在生产环境下不暴露详细信息
  if (import.meta.env.MODE !== 'production') {
    console.info('错误来源:', instance)
    console.info('错误信息:', info)
  }
}

// 性能监控
if (import.meta.env.MODE === 'production') {
  // 监控首屏加载时间
  window.addEventListener('load', () => {
    setTimeout(() => {
      if (window.performance) {
        const timing = window.performance.timing
        const pageLoadTime = timing.loadEventEnd - timing.navigationStart
        console.debug(`页面加载耗时: ${pageLoadTime}ms`)
      }
    }, 0)
  })
}

// 应用插件
app.use(ElementPlus, { size: 'default' })
app.use(router)
app.use(pinia)

// 挂载应用
app.mount('#app')

// 应用挂载后延迟预加载
// 使用类型安全的网络连接检测
const checkNetworkQuality = () => {
  // @ts-ignore - 处理浏览器兼容性问题
  const conn = navigator.connection || navigator.mozConnection || navigator.webkitConnection;
  if (conn) {
    // @ts-ignore - saveData 和 effectiveType 可能在某些浏览器不支持
    return conn.saveData === false || conn.effectiveType === '4g';
  }
  return true; // 默认认为网络良好
};

if (checkNetworkQuality()) {
  setTimeout(preloadComponents, 1000);
} else {
  // 如果网络不佳，延长预加载时间
  setTimeout(preloadComponents, 2500);
}
